perm filename DATCOM.SAI[MUD,SYS] blob sn#553537 filedate 1981-01-02 generic text, type T, neo UTF8
BEGIN "DATCOM" 
  Define ! = "comment", crlf = "('15&'12)";

! Compare Dates from PDATA with dates written observed in UFD for given file;

DEFINE UFDMAX = "100000";
DEFINE TLISTFILE ="""PDATA.PDU[MUD,SYS]""", ! files in 7/8 P dump (not known before);
	GONELIST ="""FOUND.PDU[MUD,SYS]""", ! files in PDATA not existing now;
       CHECKLIST ="""CHECK.PDU[MUD,SYS]""", ! files written since dumped;
     IMPROVELIST ="""BETTER.PDU[MUD,SYS]"""; ! files restored unnecessarily old;
DEFINE REAPRV = "'40000000000";
DEFINE UENT = "'20"; ! length of each UFD entry;
DEFINE LH = "'777777000000"; ! mask for left half of word;

PRELOAD_WITH
 CVASC("Jan"), CVASC("Feb"), CVASC("Mar"), CVASC("Apr"),
 CVASC("May"), CVASC("Jun"), CVASC("Jul"), CVASC("Aug"),
 CVASC("Sep"), CVASC("Oct"), CVASC("Nov"), CVASC("Dec");
INTEGER ARRAY MONTHS[0:11];

INTEGER ARRAY UFDINFO[0:5];

INTEGER ARRAY UFDDATA[1:UFDMAX];

INTEGER NCHAN,CCHAN,GCHAN,OCHAN,UCHAN,I,CNT,BRK,EOF,CNTU,BRKU,EOFU,NOENT,NOLOOK;
INTEGER LIN,FIL,MON,FILE,DAY,MONTH,YEAR,PTR;
INTEGER DMPDAT,FILDAT,OPPN,PPN,EXT,UFDLEN;
STRING FILENAM,UFDNAM;

! **** Program starts here ****;

! Enable REA privilege;
IF ( CALL(REAPRV,"SETPRV") LAND REAPRV ) = 0 THEN USERERR(0,1,"No REA priv.");

! Open channel for reading PDATA text;
OPEN(NCHAN←GETCHAN,"DSK",0,19,0,CNT←200,BRK,EOF);

! Open channel for writing gone list;
OPEN(GCHAN←GETCHAN,"DSK",0,0,19,0,0,0);
ENTER(GCHAN,GONELIST,NOENT);
IF NOENT THEN USERERR(0,1,"ENTER failed: " & GONELIST);

! Open channel for writing check list;
OPEN(CCHAN←GETCHAN,"DSK",0,0,19,0,0,0);
ENTER(CCHAN,CHECKLIST,NOENT);
IF NOENT THEN USERERR(0,1,"ENTER failed: " & CHECKLIST);

! Open channel for writing improvable list;
OPEN(OCHAN←GETCHAN,"DSK",0,0,19,0,0,0);
ENTER(OCHAN,IMPROVELIST,NOENT);
IF NOENT THEN USERERR(0,1,"ENTER failed: " & IMPROVELIST);

! Open channel for reading each UFD;
OPEN(UCHAN←GETCHAN,"DSK",'17,19,0,CNTU←200,BRKU,EOFU); ! dump mode;

LOOKUP(NCHAN,TLISTFILE,NOLOOK);
IF NOLOOK THEN USERERR(0,1,"LOOKUP failed: " & TLISTFILE);

SETBREAK(LIN←1,'12,'15&'14,"INS"); ! For reading one line from TLISTFILE;
SETBREAK(FIL←2,";","↓","INS"); ! For scanning filename from line;
SETBREAK(MON←3,"-",'40,"INS"); ! For getting month name, surrounded by hyphens;

OPPN←-1;	! force compare to lose first time;

WHILE ¬EOF DO
	BEGIN
	FILENAM←INPUT(NCHAN,FIL); ! Get filename from line;
	IF NOT FILENAM THEN CONTINUE;
	FILE←CVFIL(FILENAM,EXT,PPN); ! Get binary values of filename;
	DAY←INTIN(NCHAN);	  ! Get day of month dumped version was written;
	INPUT(NCHAN,MON);	  ! Skip first hyphen;
	MONTH←CVASC(INPUT(NCHAN,MON));  ! Get month name;
	YEAR←INTIN(NCHAN)-64;	  ! Year (since day zero);
	DMPDAT←-1;
	FOR I←0 STEP 1 UNTIL 11 DO IF MONTH=MONTHS[I] THEN
		BEGIN
		DMPDAT←YEAR*31*12 + I*31 + DAY - 1; ! system format date;
		DONE;
		END;
	IF DMPDAT < 0 THEN USERERR(0,1,"Illegal month name: " & CVSTR(MONTH));
	INPUT(NCHAN,LIN);	  ! Skip past end of line;
	IF PPN ≠ OPPN THEN
		BEGIN
		OPPN←PPN;
		LOOKUP(UCHAN,UFDNAM←CVXSTR(PPN)&".UFD[1,1]",NOLOOK);
		IF NOLOOK THEN
			BEGIN
			USERERR(0,1,"LOOKUP failed: " & UFDNAM);
			CONTINUE; ! ignore deleted directory;
			END;
		FILEINFO(UFDINFO); ! Get length of UFD;
		UFDLEN←-((UFDINFO[3] LSH 18) LOR (UFDINFO[3] LSH -18));
		IF UFDLEN>UFDMAX THEN USERERR(0,1,"UFD too big: "&CVXSTR(PPN));
		ARRYIN(UCHAN,UFDDATA[1],UFDLEN); ! Read whole UFD;
		CLOSE(UCHAN);
		END;
	PTR ← -1;
	FOR I ← 1 STEP UENT UNTIL UFDLEN DO
		IF (UFDDATA[I] = FILE) AND ( (UFDDATA[I+1] LAND LH) = EXT )
			THEN BEGIN PTR ← I; DONE END;
	IF PTR < 0 THEN
		BEGIN
		OUTSTR("Not found:					 "&
			FILENAM&CRLF);
		OUT(GCHAN,FILENAM&CRLF);
		CONTINUE;	! Go on to next filename in input list;
		END;
	FILDAT ← ( LDB(POINT(3,UFDDATA[PTR+1],20)) LSH 12 ) LOR
		 ( LDB(POINT(12,UFDDATA[PTR+2],35)) ); ! Date from UFD entry;
	IF DMPDAT > FILDAT THEN
		BEGIN
		OUTSTR("Can improve:			 " &
			FILENAM & " by " &
			CVS(DMPDAT-FILDAT) & " days." & CRLF);
		OUT(OCHAN,FILENAM&CRLF);
		END
	ELSE IF DMPDAT = FILDAT THEN
!		OUTSTR("Dates match: " & FILENAM & CRLF)
end of comment;
	ELSE	BEGIN
		OUTSTR("Recent file:	" & FILENAM & CRLF);
		OUT(CCHAN,FILENAM&CRLF);
		END;
	END;
RELEASE(CCHAN);
RELEASE(GCHAN);
RELEASE(OCHAN);
RELEASE(UCHAN);
RELEASE(NCHAN);
END;